package com.rpoonolly.simpleandroidgame;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;

import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import com.rpoonolly.simplegame.Config;
import com.rpoonolly.simplegame.core.aabb.AABBEntity;
import com.rpoonolly.simplegame.core.aabb.DynamicAABBEntity;

public class SimpleAndroidGame extends Activity {
	private RenderLoop renderLoop;
	private GameLoop gameLoop;
	private Map<String, List<AABBEntity>> gameWorld;
	private AndroidInputHandler inputHndlr;
	private SurfaceView worldView = null;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		MutableLock<Boolean> frame_rendered_flag = new MutableLock<Boolean>(true);
		gameWorld = loadWorld();
		
		inputHndlr = new AndroidInputHandler(this);
		gameLoop = new GameLoop(gameWorld, inputHndlr, this, frame_rendered_flag);
		renderLoop = new RenderLoop(gameWorld, this, frame_rendered_flag);
		
		worldView = new SurfaceView(this);
		SurfaceHolder holder = worldView.getHolder();
		holder.addCallback(renderLoop);
		
		setContentView(worldView);
		worldView.setOnTouchListener(inputHndlr);
	}
	
	@Override
	protected void onResume() {
		super.onResume();
		renderLoop.start();
		gameLoop.start();
	}
	
	@Override
	protected void onPause() {
		super.onPause();
		renderLoop.stop();
		gameLoop.close();
	}
	
	private Map<String, List<AABBEntity>> loadWorld() {
		Map<String, List<AABBEntity>> world = new ConcurrentHashMap<String, List<AABBEntity>>();
		List<AABBEntity> worldObjs = new CopyOnWriteArrayList<AABBEntity>();//new ArrayList<AABBEntity>();
		List<AABBEntity> enemies = new CopyOnWriteArrayList<AABBEntity>();//new ArrayList<AABBEntity>();
		
		enemies.add(new DynamicAABBEntity(100, 100, 30, 30));

		worldObjs.add( new AABBEntity( 130, -123, 182, 8) );
		worldObjs.add( new AABBEntity( 296, -115, 16, 1306) );
		worldObjs.add( new AABBEntity( -699, 1175, 995, 16) );
		worldObjs.add( new AABBEntity( -699, -113, 15, 1288) );
		worldObjs.add( new AABBEntity( -684, -113, 607, 9) );
		worldObjs.add( new AABBEntity( -77, -374, 16, 270) );
		worldObjs.add( new AABBEntity( -443, -396, 382, 22) );
		worldObjs.add( new AABBEntity( -443, -726, 10, 330) );
		worldObjs.add( new AABBEntity( -433, -726, 727, 19) );
		worldObjs.add( new AABBEntity( 259, -707, 35, 588) );
		worldObjs.add( new AABBEntity( -315, -599, 77, 122) );
		worldObjs.add( new AABBEntity( -238, -527, 250, 15) );
		worldObjs.add( new AABBEntity( 12, -527, 24, 80) );
		worldObjs.add( new AABBEntity( 36, -477, 67, 65) );
		worldObjs.add( new AABBEntity( 103, -450, 67, 74) );
		worldObjs.add( new AABBEntity( 131, -376, 18, 142) );
		worldObjs.add( new AABBEntity( 28, -234, 121, 15) );
		worldObjs.add( new AABBEntity( 112, -640, 77, 80) );
		worldObjs.add( new AABBEntity( -631, -48, 50, 50) );
		worldObjs.add( new AABBEntity( -555, 367, 318, 16) );
		worldObjs.add( new AABBEntity( -487, 22, 77, 176) );
		worldObjs.add( new AABBEntity( -257, 147, 230, 65) );
		worldObjs.add( new AABBEntity( -27, 147, 29, 300) );
		worldObjs.add( new AABBEntity( -198, 447, 381, 26) );
		worldObjs.add( new AABBEntity( -542, 582, 282, 15) );
		worldObjs.add( new AABBEntity( -282, 544, 22, 38) );
		worldObjs.add( new AABBEntity( -683, 767, 174, 13) );
		worldObjs.add( new AABBEntity( -509, 767, 16, 188) );
		worldObjs.add( new AABBEntity( -570, 1033, 49, 39) );
		worldObjs.add( new AABBEntity( -622, 849, 23, 87) );
		worldObjs.add( new AABBEntity( -385, 691, 36, 387) );
		worldObjs.add( new AABBEntity( -349, 691, 328, 27) );
		worldObjs.add( new AABBEntity( -21, 570, 40, 148) );
		worldObjs.add( new AABBEntity( 19, 570, 178, 36) );
		worldObjs.add( new AABBEntity( 182, 606, 15, 451) );
		worldObjs.add( new AABBEntity( -210, 828, 187, 99) );
		worldObjs.add( new AABBEntity( -23, 868, 74, 26) );
		worldObjs.add( new AABBEntity( 51, 806, 26, 88) );
		worldObjs.add( new AABBEntity( -265, 1030, 169, 51) );
		worldObjs.add( new AABBEntity( 8, 1013, 78, 77) );
		
		world.put(Config.ENT_GRP_WORLD_OBJS, worldObjs);
		world.put(Config.ENT_GRP_ENEMIES, enemies);
		world.put(Config.ENT_GRP_PLAYER, 
				Collections.<AABBEntity>singletonList(
						new DynamicAABBEntity(0, 0, Config.PLAYER_WIDTH, Config.PLAYER_WIDTH)));
		
		return world;
	}
}
